/**
 * 
 */
package com.letoo.dragon.common.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;

import com.aliyun.mns.client.CloudAccount;
import com.aliyun.mns.client.CloudTopic;
import com.aliyun.mns.client.MNSClient;
import com.aliyun.mns.common.ServiceException;
import com.aliyun.mns.model.BatchSmsAttributes;
import com.aliyun.mns.model.MessageAttributes;
import com.aliyun.mns.model.RawTopicMessage;
import com.aliyun.mns.model.TopicMessage;

/**
 * 阿里云消息服务的短信操作工具类 云账号AccessKey有所有API访问权限，建议遵循阿里云安全最佳实践，创建并使用RAM子账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建
 * 
 * @author dengjie
 *
 */
public class AliyunSmsUtils {

    private static final Logger LOG = LoggerFactory.getLogger(AliyunSmsUtils.class);

    /**
     * 发送短信
     * 
     * @param endpoint
     *            MNS发送短信的endpoint
     * @param topic
     *            短信专用主题
     * @param signName
     *            签名名称。暂时使用成都农商通
     * @param accessKeyId
     *            MNS子账号accessKeyId
     * @param accessKeySecret
     *            MNS子账号accessKeySecret
     * @param phoneNumber
     *            单个电话号码
     * @param paramString
     *            携带参数
     * @param templateCode
     *            短信模板
     * @return
     */
    public static TopicMessage sendSms(String endpoint, String smstopic, String signName, String accessKeyId,
            String accessKeySecret, List<String> phoneNumberArr, Map<String, String> paramStrings,
            String templateCode) {
        /**
         * Step 1. 获取主题引用
         */
        CloudAccount account = new CloudAccount(accessKeyId, accessKeySecret, endpoint);
        MNSClient client = account.getMNSClient();
        CloudTopic topic = client.getTopicRef(smstopic);
        /**
         * Step 2. 设置SMS消息体（必须）
         *
         * 注：目前暂时不支持消息内容为空，需要指定消息内容，不为空即可。
         */
        RawTopicMessage msg = new RawTopicMessage();
        msg.setMessageBody("sms-message");
        /**
         * Step 3. 生成SMS消息属性
         */
        MessageAttributes messageAttributes = new MessageAttributes();
        BatchSmsAttributes batchSmsAttributes = new BatchSmsAttributes();
        // 3.1 设置发送短信的签名（SMSSignName）
        batchSmsAttributes.setFreeSignName(signName);
        // 3.2 设置发送短信使用的模板（SMSTempateCode）
        batchSmsAttributes.setTemplateCode(templateCode);
        // 3.3 设置发送短信所使用的模板中参数对应的值（在短信模板中定义的，没有可以不用设置）
        BatchSmsAttributes.SmsReceiverParams smsReceiverParams = new BatchSmsAttributes.SmsReceiverParams();
        if (!CollectionUtils.isEmpty(paramStrings)) {
            for (Map.Entry<String, String> entry : paramStrings.entrySet()) {
                smsReceiverParams.setParam(entry.getKey(), entry.getValue());
            }
        }

        // 3.4 增加接收短信的号码
        if (!CollectionUtils.isEmpty(phoneNumberArr)) {
            for (String phoneNumber : phoneNumberArr) {
                batchSmsAttributes.addSmsReceiver(phoneNumber, smsReceiverParams);
            }
        }
        messageAttributes.setBatchSmsAttributes(batchSmsAttributes);
        TopicMessage ret = null;
        try {
            /**
             * Step 4. 发布SMS消息
             */
            ret = topic.publishMessage(msg, messageAttributes);
            LOG.info("MessageId: " + ret.getMessageId());
            LOG.info("MessageMD5: " + ret.getMessageBodyMD5());
            LOG.info("MessageBody: " + ret.getMessageBody());
        } catch (ServiceException se) {
            LOG.error(se.getErrorCode() + se.getRequestId());
            LOG.error(se.getMessage());
            LOG.error("AliyunSmsUtils sendSms method ServiceException", se);
        } catch (Exception e) {
            LOG.error("AliyunSmsUtils sendSms method Exception", e);
        }
        client.close();
        return ret;
    }

    public static void main(String[] args) {
        List<String> phoneNumberArr = new ArrayList<String>();
        phoneNumberArr.add("18628377208");
        phoneNumberArr.add("17628294729");
        Map<String, String> paramStrings = new HashMap<String, String>();
        paramStrings.put("customer", "生猛的程序员");
        sendSms("https://1649141791877527.mns.cn-qingdao.aliyuncs.com/", "sms.topic-cn-qingdao", "成都农商通",
                "LTAIX919hWDA8wZg", "iWp77oYe81XB0LKiHx7f6kXSQX3IIU", phoneNumberArr, paramStrings, "SMS_56085117");
    }
}
